package exception;

//try_catch 捕获异常
public class FinallyTest {
    public static void main(String[] args) {
        try{
            //多个 catch 代码块只会捕获一次异常
            System.out.println(10 / 0);
        }catch(ArithmeticException e){
            System.out.println("算术运算异常");
            e.printStackTrace();
        }catch(NullPointerException e){
            e.printStackTrace();
        }catch(Exception e){
            System.out.println("父类 Exception 捕获异常");
            e.printStackTrace();
        }finally{
            System.out.println("不论如何一定会执行");
        }
        System.out.println(fun());
        System.out.println("异常执行结束");
    }
    public static int fun(){
        //执行 finally 中的 return
        try{
            System.out.println(10 / 0);
            return 1;
        }catch(ArithmeticException e){
            return 3;
        }finally{
            //finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally)，
            //如果 finally 中也存在 return 语句，那么就会执行 finally 中的 return，从而不会执行到 try 中原有的 return
            //所以，一般不建议在 finally 中写 return 语句
            return 2;
        }
    }
}
